%%直接对最小幅值优化


%% 目标函数定义
function fitness = objective_function(params)
    % 假设参数为 [x1, x2, Hlimit]
    x1 = params(1);
    x2 = params(2);
    Hlimit = params(3);  % 将Hlimit作为优化变量
    
    % 传递x1, x2到Simulink模型
    assignin("base", 'x1', x1);
    assignin("base", 'x2', x2);

    % 模型文件路径
    filename = 'qiyueqi_R2023a.mdl';
    
    try
        % 运行模型仿真
        res = sim(filename);
        
        % 检查仿真结果是否有效
        if isempty(res.ScopeData)
            fitness = 9999;  % 如果仿真结果无效，返回高惩罚
            return;
        end
        
        % 获取仿真结果
        o1 = res.ScopeData.signals(1).values;
        o2 = res.ScopeData.signals(2).values;

        % 计算两个目标的差值
        H1 = max(o1) - min(o1);
        H2 = max(o2) - min(o2);
        
        % 如果H1和H2都小于Hlimit，则返回Hlimit值，目标是最小化Hlimit
        if H1 < Hlimit && H2 < Hlimit
            fitness = Hlimit;  % 只返回Hlimit作为适应度
        else
            fitness = 9999;  % 惩罚值
        end
        
    catch ME
        % 如果仿真失败，返回惩罚值
        disp('仿真失败');
        fitness = 9999;  
    end
end

%% 粒子群优化
nvars = 3;  % 优化的变量个数（x1, x2, Hlimit）
lb = [-1, -1, 0];  % 参数下界
ub = [1, 1, 1];  % 参数上界，Hlimit的范围

% 粒子群优化的参数
options = optimoptions('particleswarm', 'SwarmSize', 30, 'MaxIterations', 50, 'Display', 'iter');

% 执行粒子群优化
[bestParams, bestFitness] = particleswarm(@objective_function, nvars, lb, ub, options);

% 显示结果
fprintf('最优参数：x1 = %.10f, x2 = %.10f, Hlimit = %.10f\n', bestParams(1), bestParams(2), bestParams(3));
fprintf('最优适应度值：%.10f\n', bestFitness);
